import base64
import json
from io import BytesIO

import numpy as np
import requests
from Crypto.Cipher import AES
from PIL import Image

# 定义一个函数pad，用于对字符串s进行补全，使其长度为AES.block_size的倍数
def pad(s):
    # 定义一个变量BS，用于存储AES.block_size
    BS = AES.block_size
    # 返回s加上（BS - len(s) % BS）个字符，每个字符的ASCII码为BS - len(s) % BS
    return s + (BS - len(s) % BS) * chr(BS - len(s) % BS)

# 定义一个加密函数，参数为文本和密钥
def encrypt(text, key):
    # 设置加密模式为ECB
    mode = AES.MODE_ECB
    # 将文本补全为16的倍数
    text = pad(text).encode('utf-8')
    # 使用AES算法和密钥，以及ECB模式，创建一个加密器
    crypt = AES.new(key.encode('utf-8'), mode)
    # 将文本加密
    cipher_text = crypt.encrypt(text)
    # 将加密后的文本进行base64编码
    return base64.b64encode(cipher_text)

# 定义一个函数get_xy，用于获取图像中白色像素的x坐标
def get_xy(img):
  # 将图像转换为数组
  img_array = np.array(img)
  # 创建一个数组arr1，用于存储图像中的像素值
  arr1 = img_array[:]
  # 遍历图像中的每一个像素
  for x in range(1,arr1.shape[0]):
      for y in range(1,arr1.shape[1]):
          # 获取每一个像素的RGB值
          a = img_array[x,y][0]
          b = img_array[x,y][1]
          c = img_array[x,y][2]
          # 将每一个像素的RGB值设置为(0,0,c)
          arr1[x,y] = (0,0,c)
  # 获取图像中白色像素的坐标
  rgb_date = np.argwhere(img_array == [255, 255, 255])
  # 创建一个数组i_temp，用于存储每一个白色像素的RGB值
  i_temp = [0, 0, 0]
  # 创建一个变量num，用于记录每一个白色像素的RGB值
  num = 0
  # 遍历每一个白色像素
  for i in rgb_date:
      # 如果每一个白色像素的RGB值和i_temp中的RGB值相同，则num加1
      if i[0] == i_temp[0]:
          num = num + 1
      # 如果每一个白色像素的RGB值和i_temp中的RGB值不同，则num重置为0
      else:
          num = 0
      # 如果num大于等于7，则返回每一个白色像素的y坐标
      if num >= 7: 
          return (i[1] - 6)
      # 将每一个白色像素的RGB值赋值给i_temp
      i_temp = i

get_res = requests.get("获取验证码的地址").json() # 得到解析验证码需要用到json
imgdata = base64.b64decode(get_res["repData"]["originalImageBase64"]) # 验证码图片base64解码
x = get_xy(Image.open(BytesIO(imgdata))) # 找需要x轴需要偏移的量

x = str(x)
z = """{"x":%s,"y":5}"""%x

secretKey = get_res["repData"]["secretKey"] # 得到密钥
pointJson = encrypt(str(z), secretKey).decode('utf-8')  # 验证码偏移信息加密
pointJson = pointJson.replace("+", "%2B")
token = get_res["repData"]["token"] # 唯一令牌

session_request = requests.session() # 需要check，跳过这一步会报错